package chapter11;

import redis.clients.jedis.Jedis;

/**
 * OverSellDemo 类用于演示在多线程环境下可能出现的超卖问题
 * 它通过多个线程模拟高并发场景下的商品购买行为
 */
public class OverSellDemo extends Thread {
    // 商品的键，用于在Redis中标识商品
    private final static String GOODS_KEY = "goods:1";

    /**
     * 程序的入口点
     * 初始化商品库存，并启动多个线程模拟购买行为
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 连接本地Redis服务器
        Jedis jedis = new Jedis("localhost");
        // 设置商品库存为5，过期时间为10秒
        jedis.setex(GOODS_KEY, 10, "5");
        // 启动10个线程模拟购买行为
        for (int i = 0; i < 10; i++) {
            new OverSellDemo().start();
        }
    }

    /**
     * 线程的运行方法
     * 每个线程尝试购买商品，并打印购买结果
     */
    @Override
    public void run() {
        // 连接本地Redis服务器
        Jedis jedis = new Jedis("localhost");
        // 检查当前是否可以购买商品
        boolean canBuy = OverSellCheck.canBuy(jedis, GOODS_KEY);
        if (canBuy) {
            // 如果可以购买，打印线程名称和购买结果
            System.out.println(Thread.currentThread().getName() + " can buy");
        } else {
            // 如果不可以购买，打印线程名称和购买结果
            System.out.println(Thread.currentThread().getName() + " can not buy");
        }
    }
}
